from typing import List
from bs4 import BeautifulSoup

from axiom_boot.logging.setup import get_logger
from axiom_boot.scraper.interfaces import Extractor
from axiom_boot.scraper.models import Response, Item, Target
from src.scraper.models.SupplierItem import SupplierItem

logger = get_logger(__name__)


class ListExtractor(Extractor):
    """
    负责从搜索结果列表页中提取每个供应商的公司主页链接 (`company_url`)。
    这是进入详情页的第一步。
    """

    def extract(self, response: Response, target: Target) -> List[Item]:
        soup = BeautifulSoup(response.text, "html.parser")
        items = []
        logger.info(f"开始从列表页 {response.url} 提取供应商主页链接...")

        supplier_cards = soup.select("div.list-node")
        logger.debug(f"在列表页 {response.url} 找到了 {len(supplier_cards)} 个供应商卡片。")

        for i, card in enumerate(supplier_cards):
            item = SupplierItem()

            # 提取公司名称和主页 URL
            company_link_tag = card.select_one("h2.company-name a")
            if company_link_tag:
                item.company_name = company_link_tag.get_text(strip=True)
                href = company_link_tag.get("href")
                if href:
                    item.company_url = self._normalize_url(href)
            
            if item.company_url:
                items.append(item)

        logger.info(f"从 {response.url} 提取完成，获得 {len(items)} 个供应商主页链接。")
        return items

    def _normalize_url(self, url: str) -> str:
        """确保 URL 是完整的。"""
        if url.startswith("//"):
            return "https:" + url
        return url 